/*!
 * \file StabBranching.h
 *
 * \date May 18, 2014
 * \author correa
 */
#ifndef STABBRANCHING_H_
#define STABBRANCHING_H_

#include <Desigualdad.h>
#include <list>
#include <SeparatorParameters.h>
#include <GeneradorClique.h>
#include <Reserva.h>
#include <cstdlib>

using namespace std;

class StabBranching : public FactoryDesigualdad
{
	list<Desigualdad*> 		_desigualdades;
	const VertexSet *		_vertices;
	const ValueArray<double>*_grados;
	SeparatorParameters		_param;
	ProjectableCliqueSet	_clique;
	VertexSet	 			_nocliqueados;
	GeneradorClique * 		_eleccionClqFactory;
	ReservaClique *				_reserva;
	int						_ninitialm;

protected:
	Grafo&					_grafo;

	StabBranching(Grafo& g, ReservaClique * reserva);
	StabBranching(Grafo& g, const VertexSet& subgrafo, ReservaClique * reserva);
	void cliqueCover(const VertexSet& subgrafo);
	void edgeCliqueCover(const VertexSet& subgrafo);

public:
	virtual ~StabBranching();
	list<Desigualdad*>& branchNone();
	int getInitialModel() { return _ninitialm; };
};

class StabStabBranching : public StabBranching
{
	VertexSet				_vecinosDeFijos;
	VertexSet				_novecinos;
	list<Desigualdad*> 		_desigualdades;
protected:
	StabStabBranching(Grafo& g, const VertexSet& subgrafo, ReservaClique * reserva) : StabBranching(g, subgrafo, reserva), _desigualdades(), _vecinosDeFijos(g.getN()), _novecinos(g.getN()) {};
public:
	StabStabBranching(Grafo& g, ReservaClique * reserva) : StabBranching(g, reserva), _desigualdades(), _vecinosDeFijos(g.getN()), _novecinos(g.getN()) {};
	list<Desigualdad*>& branchZero(int v, VertexSet& fijos);
	list<Desigualdad*>& branchOne(int v);
};

#endif /* STABBRANCHING_H_ */
